/**
 * File: Grasp.c
 *
 * Integrantes:
 * @author	Jormar Arellano		(05-37840)	<jormar.arellano@gmail.com>
 * @author	Sabrina Fernández	(05-38163)	<sabrinamfm@gmail.com>
 */

#ifndef GRASP_H
#define GRASP_H

#include "LocalSearch.h"
#include "graph.h"
#include "arraylist.h"
#include "util.h"

#ifdef _cplusplus
extern "C" {
#endif

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Parametros globales del metodo
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/** 
 * Numero de iteraciones que realiza Grasp.
 */
int grasp_Giter;

/** 
 * Numero de iteraciones por color.
 */
int grasp_Citer;

/** 
 * Tamaño de la lista de candidatos.
 */
int grasp_Csize;

/** 
 * Cantida de verbose para Grasp.
 * */
int grasp_verbose;

/**
 * Inicializa las variables globales de Grasp.
 */
void grasp_defaults();

/**
 * Encuentra la calidad de una partición.
 * @param	s	Particion de colores.
 * @return Calidad de la particion. Es cero si está bien particionado.
 */
int grasp_calidad(const ArrayList *s);

/**
 * Compara dos particiones por tamaño.
 * @param	v1	Primera particion a comparar.
 * @param	v2	Segunda particion a comparar.
 * @return	 1 si |v1|<|v2|
 *			-1 si |v1|>|v2|
 *			 0 si |v1|=|v2|
 */
int comparePartitionsByLength(ArrayListValue v1, ArrayListValue v2);

/**
 * Fase de mejora de la solución.
 * @param	graph		El grafo con el cual se realizara la fase de mejora.
 * @param	partition	Particion de colores del grafo.
 * @return Un nuevo arreglo particion mejorado.
 */
ArrayList *improvePhase(Graph *graph, ArrayList *partition);

/**
 * Algoritmo principal de Grasp
 * @param	graph	Grafo a que se le busca una coloración minima.
 * @return	El grafo mejorado.
 */
Graph *grasp(Graph *graph);

#ifdef _cplusplus
}
#endif

#endif
